﻿// See https://aka.ms/new-console-template for more information
//建造者模式
//建造者模式是设计模式的一种，将一个复杂对象的构建与他的表示分离，使得同样的构建过程可以创建不同的表示。
//建造者模式主要分为以下四种角色：
//·产品（Product）：具体生产器要构造的复杂对象。
//·抽象生成器（Bulider）：抽象生成器是一个接口，创建一个产品各个部件的接口方法，以及返回产品的方法。
//·具体建造者（ConcreteBuilder）：按照自己的产品特性，实现抽象建造者对应的接口。
//·指挥者（Director）：创建一个复杂的对象，控制具体的流程。

//具体使用
//高性能电脑
HighPerformanceBuilder HighPerformanceBuilder = new HighPerformanceBuilder();
ShowComputer(HighPerformanceBuilder);
//高性价比电脑
CostEffectiveBuilder CostEffectiveBuilder = new CostEffectiveBuilder();
ShowComputer(CostEffectiveBuilder);
void ShowComputer(ComputerBuilder builder)
{
    Director director = new Director(builder);
    Computer computer=director.AssembleComputer();
    Console.WriteLine("电脑CPU为："+computer.CPU);
    Console.WriteLine("电脑内存为：" + computer.Memory);
}

//我们先创建一个产品，计算机
public class Computer
{
    public string CPU { get; set; }
    public string Memory { get; set; }//内存
    public string Disk { get; set; }//硬盘
    public string GraphicsCard { get; set; }//图形卡，即显卡
    public string MainBoard { get; set; }//主板
}

//抽象构建器
public abstract class ComputerBuilder
{
    //构建这里面有一个空的计算机。通过下面的方法可以组装
    protected Computer computer = new Computer();

    public abstract void BuildCPU();

    public abstract void BuildMemory();

    public abstract void BuildDisk();

    public abstract void BuildGraphicsCard();

    public abstract void BuildMainBoard();

    public Computer CreateComputer()
    {
        return computer;
    }
}

//具体Builder类，性价比高的计算机构建者
internal class CostEffectiveBuilder : ComputerBuilder
{
    public override void BuildCPU()
    {
        computer.CPU = "i5处理器";
    }

    public override void BuildDisk()
    {
        computer.Disk = "512固态";
    }

    public override void BuildGraphicsCard()
    {
        computer.GraphicsCard = "RTX 3050";
    }

    public override void BuildMainBoard()
    {
        computer.MainBoard = "华硕H610";
    }

    public override void BuildMemory()
    {
        computer.Memory = "16G内存";
    }
}

//具体Builder类，高性能计算机
internal class HighPerformanceBuilder : ComputerBuilder
{
    public override void BuildCPU() => computer.CPU = "i7处理器";

    public override void BuildDisk() => computer.Disk = "2t固态";

    public override void BuildGraphicsCard() => computer.GraphicsCard = "RTX 4090";

    public override void BuildMainBoard() => computer.MainBoard = "华硕Z790";

    public override void BuildMemory() => computer.Memory = "32G内存";
}

//指挥者类
//这个指挥者类传入一个具体的构造者。通过指挥者内部自己定义的顺序构建产品。
//构建顺序是由指挥者决定的，固定顺序。比如构建电脑，指挥者相当于组装师傅，先装主板，再装CPU,然后再装什么都是有顺序的，不同品牌的电脑都是电脑，组装顺序都是一样的。
//但是不同的零件具体实现就要看厂家了（具体建造者），比如有个主板十二项CPU供电，有的只有八项。
//只不过有个一个约定俗成的规矩，必须得生产哪些配件。所有的厂家都遵循这个约定。
internal class Director
{
    private ComputerBuilder _builder = null;

    public Director(ComputerBuilder builder)
    {
        _builder = builder;
    }

    //组装电脑
    public Computer AssembleComputer()
    {
        _builder.BuildMemory();
        _builder.BuildGraphicsCard();
        _builder.BuildMainBoard();
        _builder.BuildDisk();
        _builder.BuildCPU();
        return _builder.CreateComputer();
    }
}